home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / sozo2 / scsrc20.lzh / SZADB.LZH / TRACE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-21  |  2.7 KB  |  159 lines

  1. /* Copyright (c) 1990 by Sozobon, Limited.  Authors: Johann Ruegg, Don Dugger
  2.  *
  3.  * Permission is granted to anyone to use this software for any purpose
  4.  * on any computer system, and to redistribute it freely, with the
  5.  * following restrictions:
  6.  * 1) No charge may be made other than reasonable charges for reproduction.
  7.  * 2) Modified versions must be clearly marked as such.
  8.  * 3) The authors are not responsible for any harmful consequences
  9.  *    of using this software, even if they result from defects in it.
  10.  *
  11.  *    trace.c
  12.  */
  13.  
  14. #include <setjmp.h>
  15. #include "adb.h"
  16.  
  17. #define IN_TRACE
  18. #include "lang.h"
  19.  
  20. extern int trap2(), trap3(), trap4(), trap5(), trap6(), 
  21.     trap7(), trap8(), trap9(), trapx();
  22.  
  23. int myvecs;
  24. int running;
  25. int lasttrap;
  26.  
  27. struct vlist {
  28.     int    number;
  29.     int    (*vector)();
  30.     long    oldv;
  31. } vlist[] = {
  32.     {2,    trap2},
  33.     {3,    trap3},
  34.     {4,    trap4},
  35.     {5,    trap5},
  36.     {6,    trap6},
  37.     {7,    trap7},
  38.     {8,    trap8},
  39.     {9,    trap9},
  40.     {0x102,  trapx},
  41.     {0,    0}
  42. };
  43.  
  44. jmp_buf xqt_buf;
  45. extern jmp_buf trp_buf;
  46.  
  47. long
  48. ptrace(req, pid, addr, data)
  49. int req, pid;
  50. long *addr;
  51. long data;
  52. {
  53.     extern struct regs regs[];
  54.     extern int xqt();
  55.     extern long gemdos();
  56.  
  57.     switch (req) {
  58.  
  59.     case RD_TEXT:
  60.     case RD_DATA:
  61.         if ((int)addr & (sizeof(data) - 1))
  62.             return(-1);
  63.         data = *addr;
  64.         return(data);
  65.     case WR_TEXT:
  66.     case WR_DATA:
  67.         if ((int)addr & (sizeof(data) - 1))
  68.             return(-1);
  69.         *addr = data;
  70.         return(data);
  71.     case SSTEP:
  72.         *(regs[SR].value) = (*(regs[SR].value) & ~TBITS) | ITRACE;
  73.         xqt();
  74.         return(0);
  75.     case CONTINUE:
  76.         *(regs[SR].value) = *(regs[SR].value) & ~TBITS;
  77.         xqt();
  78.         return(0);
  79.     case START_DBG:
  80.         return(0);
  81.     case RD_USER:
  82.     case WR_USER:
  83.         return(-1);
  84.  
  85.     }
  86.     return(-1);
  87. }
  88.  
  89. xqt()
  90. {
  91.     running = 1;
  92.     if (setjmp(xqt_buf) == 0)
  93.         go();
  94.     running = 0;
  95.     return;
  96. }
  97.  
  98. int detail, be_instr;
  99. long be_addr;
  100.  
  101. prbuserr()
  102. {
  103.     prtf("trap: %s\n", tnm[lasttrap]);
  104.     prtf("%s %c ", fcnm[detail & 7],
  105.         (detail & 0x10) ? 'r' : 'w');
  106.     if (detail & 8)
  107. /*        prt("(not instr) ");    */
  108.         prt(M1);
  109. /*    prtf("addr %I instr %i\n",    */
  110.     prtf(M2,
  111.         be_addr, be_instr);
  112. }
  113.  
  114. trap(type, sr, pc)
  115. unsigned int type, sr;
  116. unsigned long pc;
  117. {
  118.     extern struct regs regs[];
  119.  
  120.     if (!running) {
  121. /*        prt("internal trap: ");    */
  122.         prt(M3);
  123.         prt(tnm[type]);
  124.         putchr('\n');
  125.         longjmp(trp_buf, 1);
  126.     }
  127.     *(regs[SR].value) = (unsigned long)sr;
  128.     *(regs[PC].value) = pc;
  129.     lasttrap = type;
  130.     longjmp(xqt_buf, 1);
  131. }
  132.  
  133. vects()
  134. {
  135.     long bios();
  136.     struct vlist *vp;
  137.  
  138.     vp = vlist;
  139.     while (vp->number) {
  140.         vp->oldv = bios(5, vp->number, vp->vector);
  141.         vp++;
  142.     }
  143.     myvecs = 1;
  144. }
  145.  
  146. oldvects()
  147. {
  148.     struct vlist *vp;
  149.  
  150.     if (!myvecs)
  151.         return;
  152.     vp = vlist;
  153.     while (vp->number) {
  154.         bios(5, vp->number, vp->oldv);
  155.         vp++;
  156.     }
  157.     myvecs = 0;
  158. }
  159.